package com.tupian;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * API返回结果类
 * 
 * @Copyright 智能交通
 * @author zx
 * @date 2017年8月14日 上午10:08:48 
 * =================Modify Record=================
 * @Modifier @date @Content 
 * zx 2017年8月14日 上午10:08:48 新建
 * 
 */
@Data
public class Result {

	private String msg;
	private Integer code;
	private Object data;

	/**
	 * @Description: 结果集中key的名称枚举
	 * @Copyright 智能交通
	 * @author zx
	 * @date 2017年11月28日 下午2:36:15 
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年11月28日 下午2:36:15 新建
	 * 
	 */
	public static enum ResultKey {
		list, total, data,draw;
	}

	public static enum Status {
		success(200, "成功"), server_error(500, "服务器错误"), login_error(401, "用户登录失败"),not_found(404,"未找到资源"),
        userNotFound(-1,"用户未找到"),multiUser(-2,"检测到多个用户"),unValid(-3,"无效"),online(1,"已登陆"),offline(0,"未登陆");
		private Integer value;
		private String desc;

		private Status(Integer value, String desc) {
			this.value = value;
			this.desc = desc;
		}

		public Integer getValue() {
			return value;
		}

		public void setValue(Integer value) {
			this.value = value;
		}

		public String getDesc() {
			return desc;
		}

		public void setDesc(String desc) {
			this.desc = desc;
		}

	}

	/**
	 * @description: 返回成功结果
	 * @return Result
	 * @author zx
	 * @date 2017年11月28日 下午2:47:34 
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年11月28日 下午2:47:34 新建
	 * 
	 */
	public static Result getSuccessResult() {
		Result ar = new Result();
		ar.setMsg(Status.success.getDesc());
		ar.setCode(Status.success.getValue());
		return ar;
	}

	/**
	 * @description: 返回成功结果
	 * @param data
	 * @return Result
	 * @author zx
	 * @date 2017年11月28日 下午2:40:15 
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年11月28日 下午2:40:15 新建
	 * 
	 */
	public static Result getSuccessResult(Object data) {
		Result ar = new Result();
		ar.setMsg(Status.success.getDesc());
		ar.setCode(Status.success.getValue());
		if (null != data) {
			if (data instanceof List) {
				List<?> list = (List<?>) data;
				Map<String, Object> m = new HashMap<String, Object>();
				m.put(ResultKey.total.name(), list.size());
				m.put(ResultKey.list.name(), list);
				ar.setData(m);
			} else {
				ar.setData(data);
			}
		}
		return ar;
	}

	/**
	 * @description:返回分页查询结果数据
	 * @param total
	 * @param list
	 * @return Result
	 * @author zx
	 * @date 2017年11月29日 上午9:18:44
	 * =================Modify Record=================
	 * @Modifier @date @Content
	 * zx 2017年11月29日 上午9:18:44 新建
	 *
	 */
	public static Result getSuccessPageResult(Long total, Object list,String draw) {
		Result ar = new Result();
		ar.setMsg(Status.success.getDesc());
		ar.setCode(Status.success.getValue());
		Map<String, Object> m = new HashMap<String, Object>();
		m.put(ResultKey.total.name(), total);
		m.put(ResultKey.list.name(), list);
		m.put(ResultKey.draw.name(), draw);
		ar.setData(m);
		return ar;
	}

	/**
	 * @description: 返回成功结果
	 * @param msg
	 * @param data
	 * @return Result
	 * @author zx
	 * @date 2017年11月28日 下午2:40:04 
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年11月28日 下午2:40:04 新建
	 * 
	 */
	public static Result getSuccessResult(String msg, Object data) {
		Result ar = new Result();
		ar.setMsg(msg);
		ar.setCode(Status.success.getValue());
		ar.setData(data);
		return ar;
	}

	/**
	 * 返回失败结果
	 * 
	 * @author zx
	 * @date 2017年8月22日 上午11:04:30
	 * @param msg
	 *            失败信息
	 * @return 
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年8月22日 上午11:04:30 新建
	 * 
	 */
	public static Result getFailResult(String msg) {
		Result ar = new Result();
		ar.setMsg(msg);
		ar.setCode(Status.server_error.getValue());
		return ar;
	}
	
	/** 
	 * 返回错误响应
	 * @author zx 
	 * @date 2018年10月9日 下午2:56:16 
	 * @param s 响应状态枚举
	 * @return
	 * =================Modify Record=================
	 * @Modifier	@date			        @Content
	 * zx     2018年10月9日 下午2:56:16	新建
	 * 
	 */ 
	public static Result getFailResult(Status s) {
		Result ar = new Result();
		ar.setMsg(s.getDesc());
		ar.setCode(s.getValue());
		return ar;
	}
	
	/** 
	 * 返回错误响应
	 * @author zx 
	 * @date 2018年10月10日 上午11:07:57 
	 * @param s
	 * @param msg
	 * @return
	 * =================Modify Record=================
	 * @Modifier	@date			        @Content
	 * zx     2018年10月10日 上午11:07:57	新建
	 * 
	 */ 
	public static Result getFailResult(Status s,String msg) {
		Result ar = new Result();
		ar.setMsg(msg);
		ar.setCode(s.getValue());
		return ar;
	}

	/**
	 * 返回失败结果
	 * 
	 * @author zx
	 * @date 2017年8月22日 上午11:04:30
	 * @return
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年8月22日 上午11:04:30 新建
	 * 
	 */
	public static Result getFailResult() {
		Result ar = new Result();
		ar.setMsg(Status.server_error.getDesc());
		ar.setCode(Status.server_error.getValue());
		return ar;
	}

	/**
	 * @description: 检查是否有参数为空
	 * @param param
	 * @return Result 如果有返回Result；否则返回null
	 * @author zx
	 * @date 2017年12月5日 下午2:56:07 
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年12月5日 下午2:56:07 新建
	 * 
	 */
	public static Result checkEmptyParam(Object... param) {
		Boolean flag = false;
		for (Object object : param) {
			if (null == object) {
				flag = true;
				break;
			} else {
				if (object instanceof String) {
					if (StringUtils.isBlank(object + "")) {
						flag = true;
						break;
					}
				}
			}
		}
		if (flag) {
			return getFailResult("param can not be null");
		} else {
			return null;
		}
	}

	/**
	 * 返回失败结果
	 * 
	 * @author zx
	 * @date 2017年8月22日 上午11:04:30
	 * @return
	 * =================Modify Record=================
	 * @Modifier @date @Content 
	 * zx 2017年8月22日 上午11:04:30 新建
	 * 
	 */
	public static Result getLoginFailResult() {
		Result ar = new Result();
		ar.setMsg(Status.login_error.getDesc());
		ar.setCode(Status.login_error.getValue());
		return ar;
	}

}
